/**
 *********************************************************
 ** <h1>SFMLex - Simple and Fast Multimedia Library Extensions.</h1>
 ** SFMLex Copyright (C) 2008 Neil Johnson (neil@emailus.me.uk)
 **
 ** SFML - Simple and Fast Multimedia Library
 ** Copyright (C) 2007-2008 Laurent Gomila (laurent.gom@gmail.com)
 **
 ** This software is provided 'as-is', without any express or implied warranty.
 ** In no event will the authors be held liable for any damages arising from the use of this software.
 **
 ** Permission is granted to anyone to use this software for any purpose,
 ** including commercial applications, and to alter it and redistribute it freely,
 ** subject to the following restrictions:
 **
 ** 1. The origin of this software must not be misrepresented;
 **    you must not claim that you wrote the original software.
 **    If you use this software in a product, an acknowledgment
 **    in the product documentation would be appreciated but is not required.
 **
 ** 2. Altered source versions must be plainly marked as such,
 **    and must not be misrepresented as being the original software.
 **
 ** 3. This notice may not be removed or altered from any source distribution.
 **
 ************************************************************
 */
#ifndef SM_H
#define SM_H

#include <map>
#include <string>
#include <stdio.h>

namespace sfx
{
   class c_AppState;
   
   class c_AppStateMachine
   {
   public:
      c_AppStateMachine( void ) :
         m_States(),
         m_CurrentStateName(),
         m_NextStateName()
      {
         printf( "(%s:%p): "
                 "constructed"
                 "\n",
                 m_LogName,
                 (void*)this );

      }

      void Run( void );
      
      void addState( c_AppState* State );
      
      void setNextState( std::string Name )
      {
         m_NextStateName = Name;
      }
   
   private:
      std::map<std::string, c_AppState*> m_States;
      
      static const char* m_LogName;

      std::string m_CurrentStateName;
      std::string m_NextStateName;
   };

   class c_AppState
   {
   public:
      c_AppState( void ) :
         m_AppStateMachine( 0 )
      {
         printf( "(%s:%p): "
                 "constructed"
                 "\n",
                 m_LogName,
                 (void*)this );
      }
      
      void setAppStateMachineManager( c_AppStateMachine* AppStateMachine )
      {
         m_AppStateMachine = AppStateMachine;
      }
      
      virtual void         Enter( void ) = 0;
      virtual void         Exit( void ) = 0;
      virtual void         Run( void ) = 0;
      virtual std::string& getName( void ) = 0;

   protected:
      c_AppStateMachine*  m_AppStateMachine;

   private:
      static const char* m_LogName;

   };

}

#endif //SM_H


